iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
AI/ ML & Data

使用 jq 處理資料系列 第 22

Day22: jq 字串轉數字

  • 分享至 

  • xImage
  •  

昨天我們認識了 jq slurp,把多個 json 輸入讀取成為一個大的陣列,便於整合不同 json 之間的資料。而我們使用 .movingDirection 移動方向的欄位,做對應,如 "N" 對應為 "北 ↑"。今天來試試,如果是風速顯示為對應的蒲福風級,該如何做呢?

對話中學習

師傅:今天我們來學習如何使用 jq 處理蒲福風級表的資料。

徒弟:好的,師傅。蒲福風級表是什麼?

師傅:蒲福風級表是用來描述風力強度的標準。每個級數都有最小和最大風速。

徒弟:明白了。那麼我們要如何處理這些資料呢?

師傅:首先,我們需要將字串型態的風速轉換為數字。看這個例子:

echo '{"maxWindSpeed": "10.7"}' | jq '.maxWindSpeed | tonumber'

徒弟:這會將 "10.7" 轉換為數字 10.7 對吧?

師傅:沒錯。接下來,我們需要判斷風速是否在某個級數的範圍內。

echo '{"speed": 10.5, "min": 8.0, "max": 10.7}' | jq '.speed >= .min and .speed < .max'

徒弟:這會輸出 true 嗎?因為 10.5 在 8.0 和 10.7 之間。

師傅:正確。接著結合這兩個概念,運用於先前山陀兒颱風的資料之中吧。

蒲福風級表

將氣象局提供的的蒲福風級表轉換成 beaufort_wind.json,如下:

  • 超過13級之後我是自己命名,因為原本是沒有命名的
  • 速度的部分單位是 公尺/每秒 (m/s)
[
    {        "level": "0 無風",        "min": 0,        "max": 0.3    },
    {        "level": "1 軟風",        "min": 0.3,        "max": 1.6    },
    {        "level": "2 輕風",        "min": 1.6,        "max": 3.4    },
    {        "level": "3 微風",        "min": 3.4,        "max": 5.5    },
    {        "level": "4 和風",        "min": 5.5,        "max": 8.0    },
    {        "level": "5 清風",        "min": 8.0,        "max": 10.8    },
    {        "level": "6 強風",        "min": 10.8,        "max": 13.9    },
    {        "level": "7 疾風",        "min": 13.9,        "max": 17.2    },
    {        "level": "8 大風",        "min": 17.2,        "max": 20.8    },
    {        "level": "9 烈風  ",        "min": 20.8,        "max": 24.5    },
    {        "level": "10 狂風  ",        "min": 24.5,        "max": 28.5    },
    {        "level": "11 暴風  ",        "min": 28.5,        "max": 32.7    },
    {        "level": "12 颶風  ",        "min": 32.7,        "max": 37    },
    {        "level": "13 颶風+",        "min": 37,        "max": 41.5    },
    {        "level": "14 颶風++",        "min": 41.5,        "max": 46.2    },
    {        "level": "15 颶風+++",        "min": 46.2,        "max": 51.0    },
    {        "level": "16 颶風++++",        "min": 51.0,        "max": 56.1    },
    {        "level": "17 颶風+++++",        "min": 56.1,        "max": 61.3    },
    {        "level": "爆表了(°Д°)",        "min": 61.4,        "max": 90    }
]

將文字轉換為數字 tonumber 並做比較

字串轉數字在 jq 中,可以使用 tonumber 函數。用法就是 欄位 | tonumber

https://ithelp.ithome.com.tw/upload/images/20241006/20078389XnrbTjjB9y.png

接著,我們用蒲福風級的陣列資料每一筆,比較欄位的值是否位於最小值與最大值之間。注意,這邊必須要是數值才能做大小的比較;使用文字做比較會有錯誤的結果。假設上面的陣列資料已經讀取為 $wind 變數,程式碼如下:

((.maxWindSpeed|tonumber) as $speed | $wind[] | select($speed>=.min and $speed<.max) | .level)

上面這個指令首先將輸入的風速轉為數字存為$speed變數,然後一筆一筆的比較蒲福風級表的每個級數,選擇風速落在其範圍內的級數,最後輸出對應的風力等級。

原本的程式修改之後,把資料的時間點往前挪,可以看到 10/1 最大陣風有爆表的風速,登陸的 10/3 中午風速已經略降了,只是在沒有山脈的阻擋情況下,直接往都市平原吹的風力還是非常恐怖的。

時間            經度    緯度    氣壓    風速MAX         陣風MAX         方向    預測
2024-10-01T06   119.8   20.7    915     16 颶風++++     爆表了(°Д°)     北 ↑
...(略)
2024-10-03T12   120.3   22.5    965     12 颶風         14 颶風++       東北 ↗
2024-10-03T13   120.3   22.6    965     12 颶風         14 颶風++       北 ↑
2024-10-03T14   120.4   22.6    965     12 颶風         14 颶風++       東 →

結論

今天認識了字串轉數字的 tonumber 的用法、用到了數字大小的比較 $speed>=.min and $speed<.max,仔細看這個練習,是不是應用了我們之前學的很多用法呢? 今天的修改可以參考 程式碼

感謝自己,今天也認真學習和練習😄。感謝大家互相幫忙,持續整理收拾山陀兒颱風留下的滿地傷。


上一篇
Day21: jq slurp
下一篇
Day23: jq 自定義函式
系列文
使用 jq 處理資料30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言